
大孫女、小孫女,快,都別忙了,到阿公身邊坐著。
小孫女,瞧妳這丫頭,在院子裡跟小花貓玩得滿頭是汗,連小鞋子都跑掉了一隻,快讓阿公瞧瞧。大孫女,妳也別再揉眼睛了,螢幕看久了傷眼。阿公剛用熱開水洗了茶溫,泡了一壺喉韻溫潤的高山老烏龍,這琥珀熱茶熱騰騰地冒著煙,香氣四溢,快和妹妹一塊兒喝一口,暖暖身子。
阿公摸了摸這頭白髮銀霜,看著妳們兩個,心裡就暖洋洋的。大孫女啊,阿公看妳盯著那張「個別減損評估明細表」發愣,嘆氣嘆得連隔壁鄰居都能聽見。妳跟阿公抱怨,說妳那會寫程式的同事,把儲存格位置都「寫死了」,結果報表一改版,數字全對不上,害妳們大半夜還在對帳,對得頭昏眼花。
來,喝口茶。今天咱們這「Day 4」的修行,阿公就拿以前在鄉下農會整理老糧倉的智慧,來給妳講講怎麼 「告別硬編碼(Hardcoding)」,用 「動態欄位對照技術」 收服那些天天在變臉的財務報表。
大孫女,妳說妳同事在寫 VBA 巨集時,貪圖一時省事,在程式碼裡寫滿了像是 Cells(i, 1)、Range("A" & i) 這種硬梆梆、指名道姓的「硬編碼」。
這讓阿公想起以前鄉下曬穀場的規矩。如果阿公跟長工說:「大門進去左邊第一個位置放的是打穀機(欄位 A),第二個位置放的是裝滿稻穀的麻布袋(欄位 B)。」大家都照這規矩做事,確實相安無事。可是,下個月曬穀場改建了,打穀機被挪到了第二個位置,第一個位置改放老母雞。這時候,如果妳那耿直的長工還死守著舊指令,眼睛閉著就往第一個位置摸去,那他不就當場抓了一手雞毛,還被老母雞狠狠啄了一口?
在妳們的「個別減損評估明細表」裡,也是一模一樣的慘劇。每個月分行交上來的報表版本都在微調。這個月「客戶編號」在 A 欄,下個月改版,欄位順序一變,「客編」跑到了 B 欄。妳那寫死了 Cells(i, 1) 的巨集,根本不知道欄位已經悄悄搬家,依然傻傻地去抓第一欄的資料。
結果呢?它直接把第一欄的「客戶名稱」當成「減損評估金額」拼命加總,數字牛頭不對馬嘴,報表算出來差了幾十億,造成了財務部門的大災難。這哪是寫程式,這簡直是讓老實人去踩地雷啊!
阿公常說:「做事要活絡,路不轉人轉。」 既然我們沒法子保證報表的欄位一輩子不挪位置,那我們就要在程式裡引入 動態欄位映射(Dynamic Column Mapping) 與自動驗證機制。
妳跟阿公說過,VBA 裡有一種非常好用的容器叫 Dictionary(字典)。阿公教妳,在我們開始讀取任何一張明細表、提取資料之前,先讓程式做這三件事:
"統編" -> 2(代表第二欄)。"減損評估金額" -> 5(代表第五欄)。大孫女妳瞧,有了這張動態地圖,不管下個月分行怎麼調換欄位順序、怎麼挪移格子,妳的程式都像裝了自動認路的眼睛,能精準無誤地把對應的資料給揪出來,再也不會發生拿老母雞去打穀的笑話了。
不過,阿公活了這大半輩子,最明白一件事:人心是最難猜的,寫報表的人更是隨性。
今天大孫女妳寫了地圖,高高興興地去字典裡搜尋「客戶編號」。結果下個月,某個分行的承辦人員心情好,把標題少寫了一個字,改成「客編」;又或者另一個分行寫成了「客戶代號」。妳這字典如果死腦筋,只認得一模一樣的字,那只要使用者微調一個字,巨集就會找不到欄位,當場拋出錯誤、罷工中斷。
所以,阿公叮嚀妳,在架構設計上,一定要預先準備好一個 「近義詞字典(Synonym Dictionary)」:
"Client_ID"),再存入對照字典中。這樣一來,就算使用者微調了字眼,只要還在妳準備好的「同義詞陣容」裡,巨集就能穩穩當當地繼續跑,絕對不會輕易崩潰。這才是一個飽經風霜、懂得體貼人心的好系統。
大孫女,聽阿公嘮叨了這一陣子,有沒有覺得這「動態對照」的道理,其實就跟阿公在老抽屜上貼標籤、不管抽屜怎麼換位置,只要認準標籤就不會拿錯工具是一樣的?
寫程式要有彈性,就像我們鄉下的竹子,風吹得再大,它彎個腰,風過了又挺直了身子。妳把這套「動態欄位對照技術」學起來,以後不管遇到什麼千奇百怪的財務報表改版,妳都能氣定神閒地坐下來,喝口阿公泡的烏龍茶,看著電腦自己把帳給對得清清楚楚。
來,大孫女、小孫女,這茶溫剛剛好,快喝了它。阿公再去給妳們拿幾塊剛蒸好的黑糖糕,甜甜嘴。